﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace Wpfконфигуратор.Визуализаторы
{
    public class ПеременнаяВизуализатор  : ВизуализаторОснова
    {
        private ДинамикОбъект _выбранныйТип;
        public ДинамикОбъект ВыбранныйТип
        {
            get
            {
                if ( ПодходящиеТипы.Count == 1 )
                {
                    _выбранныйТип = ПодходящиеТипы[0];
                }
                return _выбранныйТип;
            }
            set { 
                if (ПодходящиеТипы.Contains(value))
                {
                    _выбранныйТип = value;
                    Конструктор = null;

                    ОбновитьСвойство( "ВыбранныйТип" );
                    ОбновитьСвойство( "Конструкторы" ); 
                }
            }
        }
        // сборки могут подгружаться  и появляться новые типы , т.е. каждый раз подходящие типы нужно искать заново
        private List<ДинамикОбъект> _подходящиеТипы;
        public List<ДинамикОбъект> ПодходящиеТипы
        {
            get { return _подходящиеТипы ?? (_подходящиеТипы = НайтиПодходящиеТипы()); }
        }
        public List<ДинамикОбъект> НайтиПодходящиеТипы ()
        {
            var типы = new List<ДинамикОбъект>();
            var типПеременной = Переменная.ТипПеременной.Тип;

            if (!типПеременной.IsAbstract && !типПеременной.IsInterface) типы.Add(new ДинамикОбъект(типПеременной));

            foreach ( var assembly in AppDomain.CurrentDomain.GetAssemblies() )
            {
                foreach (var type in assembly.GetTypes())
                {
                    if ( !type.IsAbstract && !type.IsInterface )
                    {
                        if ( ! типПеременной.IsInterface)
                        {
                            if (type.IsSubclassOf(типПеременной) )
                                типы.Add(new ДинамикОбъект(type));
                        }
                        else
                        {
                            Type[] inters = type.GetInterfaces();

                            if (inters.Length != 0 && inters.Contains(типПеременной) ) 
                                типы.Add(new ДинамикОбъект(type));
                        }
                    }
                 
                }
            }
            return типы;
        }

        public КонструкторВизуализатор[] Конструкторы { get
            {
                return ВыбранныйТип != null ? ВыбранныйТип.Конструкторы: null;
            }
        }

        public КонструкторВизуализатор   _выбранныйКонструктор;
        public КонструкторВизуализатор Конструктор
        {
            get
            {
                if (Конструкторы != null && Конструкторы.Length == 1 ) _выбранныйКонструктор = Конструкторы[0];
                return _выбранныйКонструктор;
            }
            set { 
                    _выбранныйКонструктор = value;
                    ОбновитьСвойство( "Конструктор" ); 
                }
        }

        public void СоздатьОбъект()
        {
            if (Конструктор != null)
            {
                Объект = Конструктор.СоздатьОбъект(null);
            }

        }

        // еще одна функция - присвоение т.е. взятие существующего объекта либо из клипборда
        // либо из некоторого справочника ( диспетчера, поля другого объекта)   путем перетаскивания
        // либо возврата из функции
    }
}
